<?php
namespace app\member\pay;
/**
 * 支付宝服务
 */
class AlipayMobilePay {

    /**
     * 生成支付订单字符
     * @param $info
     * @param string $type
     * @return string
     */
    public function getPay($info) {

        $config = target('member/PayConfig')->getConfig('alipay_mobile');

        // 支付宝合作者身份ID
        $partner = $config['partner'];
        // 支付宝账号
        $seller_id = $config['email'];
        // 异步通知地址
        $notify_url = urlencode('http://' . trim($_SERVER['HTTP_HOST'], '/') . $info['url']);
        // 订单标题
        $subject = $info['title'];
        // 订单详情
        $body = $info['content'];
        // 订单号，示例代码使用时间值作为唯一的订单ID号
        $out_trade_no = $info['out_trade_no']; // date('YmdHis', time());
        $parameter = array(
            'service' => 'mobile.securitypay.pay',   // 必填，接口名称，固定值
            'partner' => $partner,                   // 必填，合作商户号
            '_input_charset' => 'UTF-8',                    // 必填，参数编码字符集
            'out_trade_no' => $out_trade_no,              // 必填，商户网站唯一订单号
            'subject' => $subject,                   // 必填，商品名称
            'payment_type' => '1',                        // 必填，支付类型
            'seller_id' => $seller_id,                 // 必填，卖家支付宝账号
            'total_fee' => $info['total'],         // 必填，总金额，取值范围为[0.01,100000000.00]
            'body' => $body,                      // 必填，商品详情
            'it_b_pay' => '1d',                       // 可选，未付款交易的超时时间
            'notify_url' => $notify_url,                // 可选，服务器异步通知页面路径
        );
        //生成需要签名的订单
        $orderInfo = $this->createLinkstring($parameter);
        //签名
        $sign = $this->rsaSign($orderInfo);
        //生成订单
        $orderInfo .= '&sign="' . $sign . '"&sign_type="RSA"';
        return $orderInfo;
    }

    /**
     * 对签名字符串转义
     * @param $para
     * @return string
     */
    protected function createLinkstring($para) {
        $arg = "";
        while (list ($key, $val) = each($para)) {
            $arg .= $key . '="' . $val . '"&';
        }
        //去掉最后一个&字符
        $arg = substr($arg, 0, count($arg) - 2);
        //如果存在转义字符，那么去掉转义
        if (get_magic_quotes_gpc()) {
            $arg = stripslashes($arg);
        }
        return $arg;
    }

    /**
     * 签名生成订单信息
     * @param $data
     * @return string
     */
    protected function rsaSign($data) {
        // 私密
        $privateKeyFilePath = APP_PATH . 'member/util/rsa_private_key.pem';
        // 上传私密
        $res = openssl_get_privatekey(file_get_contents($privateKeyFilePath));
        openssl_sign($data, $sign, $res);
        openssl_free_key($res);
        $sign = base64_encode($sign);
        $sign = urlencode($sign);
        return $sign;
    }


}